package com.example.study2.constructor;

import java.util.ArrayList;

/**
 * 演示可变对象带来的浅拷贝问题
 */
public class ShallowCopyProblem {
    public static void main(String[] args) {
        // 创建包含可变StringBuilder对象的原始列表
        ArrayList<StringBuilder> original = new ArrayList<>();
        original.add(new StringBuilder("文本1"));  // 添加可变的StringBuilder对象
        original.add(new StringBuilder("文本2"));  // 另一个可变对象

        // 执行浅拷贝：两个列表现在共享相同的StringBuilder引用
        ArrayList<StringBuilder> shallowCopy = new ArrayList<>(original);

        System.out.println("=== 修改前 ===");
        System.out.println("原始列表内容: " + getContents(original));
        System.out.println("拷贝列表内容: " + getContents(shallowCopy));
        System.out.println("两个列表是否包含相同对象？ " +
                (original.get(0) == shallowCopy.get(0))); // 验证是同一对象

        // 🚨 问题演示：修改原始列表中的对象
        // 由于是浅拷贝，这个修改会影响两个列表！
        original.get(0).append(" - 已修改");

        System.out.println("=== 修改后 ===");
        System.out.println("原始列表内容: " + getContents(original));
        System.out.println("拷贝列表内容: " + getContents(shallowCopy));
        System.out.println("❌ 问题暴露：两个列表的内容都发生了变化！");
        System.out.println("原因：浅拷贝只复制引用，不创建新对象");
    }

    /**
     * 辅助方法：获取StringBuilder列表的内容
     * @param list 包含StringBuilder的列表
     * @return 包含字符串内容的列表
     */
    private static ArrayList<String> getContents(ArrayList<StringBuilder> list) {
        ArrayList<String> contents = new ArrayList<>();
        for (StringBuilder sb : list) {
            contents.add(sb.toString());  // 将StringBuilder转换为String
        }
        return contents;
    }
}